package com.thread.threadfirst.studyThread4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 5、线程池
 * 线程池的好处：
 * 有线程执行完任务了，该线程不会消失，只是空闲下来了，等待新的任务。所以如果任务和线程池的数量控制的非常好的情况下，不需要启动新的线程就可以执行好多好多任务，效率也高，并发性也比较好。
 * 启动线程和关闭线程都是需要消耗大量系统资源的，所以能重用就重用。
 * <p>
 * 线程池维护了2个队列：待完成任务的队列；已完成任务的队列。
 */
public class T_ThreadPool {
    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(5);  //创建了固定数量为5的线程池。Executors有一些工厂方法和工具方法，肯定会产生新的产品，就产生了fixed固定数量为5的线程池，
        // 即直接new出了5个线程，当然这5个线程是需要的时候才启动，现在并没有启动。而java的所有线程池都实现了ExecutorService接口，而ExecutorService接口是可以发布任务的。
        // 发布任务有2种方法：execute() 执行Runnable任务；submit() 可以执行无返回值的Runnable任务 也可以执行有返回值的Callable任务。

        for (int i = 0; i < 6; i++) {  //for循环了6次 创造了6个任务，肯定是有一个线程执行了2次。
            service.execute(() -> {  //注意：Executor是自动调用Runnable的run()方法，不像之前的需要手动写出start();线程才启动。
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            });
        }

        System.out.println(service);  //输出了：Running：线程状态;pool size：线程池的线程个数;active threads：活跃的线程个数，上面生成了5个线程的线程池，这里active的个数也是5，证明这5个线程都启动了;
        //queued tasks：任务队列中的任务个数;completed tasks：已完成的任务队列中的任务个数 即线程池完成的任务放入此队列中。

        service.shutdown();  //线程关闭，等待所有任务都执行完才关闭。
//        service.shutdownNow();  //线程关闭，不等所有任务都执行完就马上关闭。
        System.out.println(service.isTerminated());  //所有的任务是否都执行完了。
        System.out.println(service.isShutdown());  //线程是否关闭了，线程关闭不代表所有任务都执行完了，输出：true，正在关闭也是关闭状态。
        System.out.println(service);  //线程池状态是Shutting down：线程池正在关闭，故上面的isShutdown：true。

        try {
            TimeUnit.SECONDS.sleep(5);  //sleep5秒，等待线程池完成所有任务。
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(service.isTerminated());  //true:所有的任务都执行完了。
        System.out.println(service.isShutdown());
        System.out.println(service);  //线程池状态是Terminated：正常结束;completed tasks：6

    }

}
